perm filename SCAN.FAI[NEW,LCS]3 blob sn#319867 filedate 1977-12-08 generic text, type T, neo UTF8
00100		TITLE SCANR
00200		ENTRY SCANR,LNEND,STFNUM,RLOOP
00300		EXTERNAL SCN,SC,ALF,NALF,EXP3.2,SCX,SCM,RMOD
00400		ML←5 ↔ K←0 ↔ NNUM←14 ↔ ISKP←13 ↔ JJ←12 ↔ XMINUS←11 ↔ DECI←10
00500		M←7 ↔ N←6 ↔ QQ←4 ↔ TRIP←3 
00600		DEFINE LL <SCN> ↔ DEFINE LR<SCN+1> ↔ DEFINE LBL <SCX+=15>
00700		DEFINE LSL <SCN+4> ↔ DEFINE LST <SCX+=11> ↔DEFINE LCM<SCX+4>
00800		DEFINE LE <SCN+5> ↔ DEFINE LC <SCN+6> ↔ DEFINE LS <SCN+7> 
00900		DEFINE LPL<SCX+=10> ↔DEFINE LMI<SCX+5> ↔ DEFINE LF <SCN+=8>
01000		DEFINE LA <SCN+=9> ↔ DEFINE LI <SCN+=10> ↔ DEFINE LW <SCN+=11>
01100		DEFINE JN <SC+=10> ↔ DEFINE DBST <SC+=11> ↔ DEFINE ISEMI <SC+=14>
01200		DEFINE IXX <SC+=13> ↔ DEFINE MODE <SC+=70> ↔ DEFINE VX <SC+=16>
01300		DEFINE LU <SCN+2> ↔ DEFINE LD <SCN+3> ↔ DEFINE INP <ALF>
01400		DEFINE REXP<SC+6> ↔DEFINE DOT<SCX+6> ↔ DEFINE VX4 <SC+=19>
01500	;;	DEFINE STAFF<SCM+=80>
01600	IQ:	BLOCK 12
01700	;	00100	C   SUBRS.   SCANR, NALF, EDIT, PRESCN
01800	;	00300	C ***** MSS SCANNER *************************
01900	;	00400	      SUBROUTINE SCANR
02000	;	00500	      DIMENSION IQ(10),LRUD(4)
02100	;	00600	      COMMON/ALF/INP(72),ML
02200	;650	COMMON/SCN/LL,LR,LU,LD,LSL,LE,LC,LS,LF,LA,LI,LW
02300	;	COMMON/SCX/RHY(4),JALPHA(30),J4,L,Y,K,RX,RZ,RA,J5
02400	;	00700	      COMMON /SC/J,L,MK
02500	;	00800	     1 ,ISKP,XMINUS,N,REXP,LK,NNUM,JJ,JN,DBST,NFLG,IXX,ISEMI,QQ
02600	;	00900	     1 ,VX(50),IAMP,K,RRN,M,MODE,IBLA
02700	;1000  EQUIVALENCE  (IQ(1),VX(41)),(VX1,VX(1)),(VX2,VX(2)),(LDN,LRUD(4))
02800	;	01100	      DATA LRUD/'L','R','U','D'/
02900	;	01200	C  FOR LEFT, RIGHT, UP, DOWN, EDIT
03000	SCANR:	0
03100		MOVE ML,ALF+=72		; 5 IS ML UNTIL RETURN
03200	      	SETOM 	NNUM  	        ;1300	      NNUM=-1
03300	      	SETZM 	ISKP  		;1400	      ISKP=0
03400	      	SETZM 	JJ    	   ;	01500	      JJ=0
03500	      	MOVSI 	XMINUS,201400	   ;	01600	      XMINUS=1.
03600				      ;	01700	C  LEAVES BLANK WHEN REST.
03700				      ;	01800	999      DECI=-1
03800	S999: 	SETOM DECI		;INTEGER UNTIL S11!
03900	      	SETZM 	M     	      ;	01900	      M=0
04000	S2799:	MOVE  	N,INP   -1(ML)	    ;	02000	2799  N=INP(ML)
04100	S899: 	AOS   	ML    	      ;	02100	899   ML=ML+1
04200		CAMN N,LSL      ;	02200	781   IF(N.EQ.'/')N=ISEMI
04300		MOVE N,ISEMI
04400					;2300	C   FOR MOTIVIC TRANFORMATIONS
04500	      	CAME N,LST             ;02380	      IF(N.EQ.'*')GO TO 751
04600		CAMN N,ISEMI
04700	      	JRST  	S751  	;	02400	      IF(N.EQ.ISEMI)GO TO 751
04800	;	02500	C  '*' AND '/' ADDED ABOVE 4/18/73
04900	      	CAMN N,IXX	    ;	02600	      IF(N.NE.IXX)GO TO 22
05000		SKIPGE SC+=10		;  JN
05100	      	JRST  	S22   	     ;	02650	      IF(JN)GO TO 22
05200	      	JUMPE 	ISKP,S210	;02700	      IF(ISKP.EQ.0)GO TO 210
05300	      	SOS   	ML    	      ;	02800	      ML=ML-1
05400	      	JRST  	S202  	      ;	02900	      GO TO 202
05500	S22:  	CAMN  	N,LBL   	;3000	22    IF(N.EQ.IBLA)GO TO 4702
05600	      	JRST  	S4702 	;	03050	      IF(N.NE.',')GO TO 510
05700	      	CAME  	N,LCM    
05800	      	JRST  	S510  
05900	S4702:	JUMPGE ISKP,S2799 	;3100	4702      IF(ISKP)202,2799,2799
06000	      	JRST  	S202  	      ;	03200	512   ML=ML+1
06100	S512:	MOVE 2,ISEMI
06200	 	AOS   	ML    	;	03300	      IF(INP(ML).EQ.ISEMI)RETURN
06300	      	CAMN  	02,INP   -1(ML)
06400		JRST SEND
06500		JRST S512+1	     ;	03400	      GO TO 512
06600	S510: 	MOVE  	02,JN    	;3600	510   IF(JN.GE.0)GO TO 173
06700	      	JUMPGE	02,S173  
06800	      	MOVEI 	02,1     ;3700	C  SKIP(JN=+1) IF NOT COMING FROM 'EDIT'
06900	      	MOVEM 	02,JN         ;	03800	      JN=1
07000	      	MOVEI 	15,1	     ;	03900	      DO 702 K=1,4
07100	S702: 	CAMN  	N,SCN  -1(15)	;4000	702   IF(N.EQ.LRUD(K))GO TO 703
07200	      	JRST  	S703  
07300	      	CAIGE 	15,4
07400	      	CAIGE 	15,4
07500	      	AOJA  	15,S702  	;	04100	C  FINDS L, R, U, D
07600	;	04200	C  YOU CAN TYPE THE FULL WORD
07700	;	04300	703   JJ=JJ+1
07800	S703: 	AOS   	JJ    
07900		MOVE K,15	;	04400	      IF(K.NE.4)GO TO 77
08000		CAIE K,4
08100	      	JRST  	S77   	;	04450	      IF(INP(ML).EQ.'E')K=99
08200		MOVE 2,LE
08300		CAMN 2,INP-1(ML)
08400		MOVEI K,=99	;	04500	C   'DE'=DELETE
08500	;	04600	77    IF(N.EQ.'E')K=55
08600	S77:  	CAMN N,LE
08700		MOVEI K,=55 	;	04700	C   'E'= EDIT
08800		CAMN N,LC	;	04800	      IF(N.EQ.'C')K=2222
08900		MOVEI K,=2222		; COPY  04900	      IF(N.EQ.IXX)K=222
09000		CAMN N,IXX		; EXIT
09100		MOVEI K,=222  	;05000	C   'C'=COPY, 'X'=EXIT FROM EDIT MODE
09200		FLTR K,K	;	05100	      VX(JJ)=K
09300		MOVEM K,VX-1(JJ)	;05200	704   IF(INP(ML).EQ.IBLA)GO TO 2799
09400	S704: 	SKIPL INP-1(ML)    ;IF(INP(ML).GT.0)GO TO 2799
09500		JRST S2799	; IF NEXT CHAR. IS A LETTER(NEG.), SKIP IT.
09600	;	05300	C  PUT COMMA ERASER IN SCX.
09700		AOJA ML,S704		;05400	      ML=ML+1
09800	;	05500	C  SO IT WILL SKIP 'D' AND 'EL' IN 'EDIT' AND 'DEL'
09900				; GO TO 704
10000	S173: 	JSA   	16,NALF  	;	05700	173   K=NALF(N)
10100		JUMP N		; 0 IS K
10200		JUMPG N,S1410		;05800	      IF(N.GT.0)GO TO 1410
10300		CAIN =18		;5810	--R-- IF(K.EQ.18)GO TO 73
10400	      	JRST  	S73   
10500	      	MOVEI 	02,2	;	05815	C   JUMP IF A REST OR OTHER R'S
10600	      	CAMN  	02,MODE      ;	05820	      IF(MODE.EQ.2)GO TO 144
10700	      	JRST  	S144  
10800				;YOU CAN TYPE 'S', ETC., FOR SIXTEENTH ETC., RHYTHM.
10900				;  JUMP IF NOT A LETTER
11000	
11100	; notes =  1xyz.0   x=accidental, yz=note num.,  negative=chord note
11200	; rest  =  2xyz.0   z=0=ordinary, =1=invis., =2=whole, =3=repeat bar
11300	;                   =4=down, =5=up, -2xyz=num. of meas. rest
11400	; clefs =  3xyz.0   z=0=treble, =1=bass, =2=alto, =3=tenor, neg.=invis.
11500	; bars  =  4xyz.0   z=num. of staves up, neg.=dbl.bar
11600	; ksig  = 17xyz.0   z=num. of accis.,  pos.=#, neg.=b,  x=1 for naturals.
11700	; meter = 18xyz.n   xy=top num, zn=bottom num	(DONE IN SCMSS)
11800	; stem  =  5xyz.0   YZ=10=stem up,  =20=stem down
11900	; staff =  5xyz.0   z=0=return to norm., =1=lower stf., =2=upper stf.
12000	
12100		CAIGE =8        ;6100 --H--   IF(K.LT.8)GO TO 15
12200	      	JRST  	S15   		;06200	C   JUMP IF A POSSIBLE NOTE
12300		CAIE =11	   ;6300  --K--	      IF(K.NE.11)GO TO 16
12400	      	JRST  	S16   		;06400	C   JUMP IF NOT A KSIG
12500		MOVE QQ,[17000.0]	;QQ=17000   **** KEY SIGS ***
12600	S18:  	MOVE  	N,INP-1(ML)     ;6500	18    N=INP(ML)
12700	      	AOS   	ML     	      ;	06600	      ML=ML+1
12800		CAMN N,LBL		;IF(N.EQ.IBLA)GO TO 18
12900		JRST S18
13000		CAME N,[ASCIZ/N    /]  ; IS IT AN N?  K3FN/  OR  K2SN/ MAKES NATURALS
13100		JRST S200	;IF NEXT CHAR='N' A 'NATURALS' KEY SIG.
13200		MOVE 2,[100.0]
13300		SKIPG QQ
13400		MOVNS 2
13500		FADR QQ,2
13600		JRST S18
13700	S200:	CAME N,LS    	;	06750	      IF(N.EQ.'S')GO TO 18
13800	   	CAMN  	N,LPL    ;	06775	      IF(N.EQ.'+')GO TO 18
13900	      	JRST  	S18   	;	06800	      IF(N.EQ.ISEMI)GO TO 20
14000		CAMN N,ISEMI
14100	      	JRST  	S20   ;	06900	      IF(N.EQ.'-')N='F'
14200	   	CAMN  	N,LMI    
14300		JRST .+3                ;6950	      IF(N.NE.'F')GO TO 18
14400	     	CAME  	N,LF     
14500	      	JRST  	S19   	;	07200	19    A=NALF(N)
14600		MOVNS QQ		;NEG. FOR FLATS
14700		JRST S18		;GO BACK AND LOOK AGAIN
14800	S19:  	JSA   	16,NALF  
14900		JUMP N
15000		FLTR K,K		;TLC K,232000
15100		JRST S18
15200	S20:	JUMPL QQ,.+3
15300		FADR QQ,K
15400		SKIPA
15500	  	FSBR QQ,K     	       ;07400	20    VX(1)=(17000.+A)*XMINUS
15600	      	MOVEM 	QQ,VX    ;07500     KSIG
15700		JRST SEND	     ;	07600	      RETURN
15800	S16:  	CAIE =9		     ;-- I --  7700	16    IF(K.NE.9)GO TO 2
15900	      	JRST  	S2    
16000	      	MOVSI 	02,205540	    ;	07800	      VX(1)=22.
16100	      	MOVEM 	02,VX    	     ;	07900	C   FOR EDIT I21 ETC.
16200	      	JRST  	S2799 	     		;8000	      GO TO 2799
16300	S2:   	CAIE =13		; -- M --  08100  2     IF(K.NE.13)GO TO 3
16400	      	JRST  	S3    	        ;8200	C   JUMP IF NOT A MEASURE LINE
16500	;;      	MOVSI 	02,214764  	; ***** BARS =4000  ******
16550		MOVE 2,[4001.0]		; THE 1 IS FOR BAR ONE STAFF ONLY.
16600	MM:	MOVE  	1,INP  -1(ML)	    ;08310	MM:       JN=INP(ML)
16700		MOVEM 1,JN
16800	;;      	CAME  	1,LD    	    ;	08320	      IF(JN.NE.LD)GO TO 23
16900	;;      	JRST  	S23   
16910		CAMN 1,LD	;  IF (JN.EQ.LD)GO TO MD
16920		JRST MD
16930		CAME 1,[-=27245141952]	;IF (JN.NE.'M')GO TO 23
16940		JRST S23
16950		FADR 2,[1.0]	;VX(1)=VX(1)+1    GO TO MM
16960		AOJA ML,MM	; GO BACK AND LOOK FOR MORE M'S  ML=ML+1
17000	MD:      	AOS   	ML    			;8330	      ML=ML+1
17100					     ;  FOUND 'MDN' -- FOR DOUBLE BARS
17200	      	SETZM 	JN    			;8350	      JN=0
17300	      	MOVNS 	02			;DBL BARS ARE NEG.
17400	S23:  	MOVEM 	02,VX    
17500	  	JSA 16,NALF
17600		JUMP INP-1(ML)		    ;8400	23    K=NALF(INP(ML))
17700	      	JUMPLE	K,S512  	     ;	08500	      IF(K.LE.0)GO TO 512
17800		CAILE =9	       ; 08505	      IF(K.GT.9)GO TO 512
17900	      	JRST  	S512  		;NO MORE THAN 8 STAVES UP ALLOWED.
17950		SOJ K,		;K=K-1  BECAUSE ORIG. NUM WAS 4001, NOT 4000
18000		SKIPN JN	   ;8510 OLD CODE HERE!      IF(JN.EQ.0)K=K+10
18100		MOVNS K 		;NEG. IF DBL BAR
18200		FLTR K,K		
18300	      	FADRM 	K,VX           ;08600	C  'M2'= A BAR LINE UP 2 STAVES. ETC.
18400	      	JRST  	S512  	     ;	08700	      GO TO 512
18500	S3:   	CAILE =16	    ;-- P -- 08800	3     IF(K.GT.16)GO TO 4
18600	      	JRST  	S4    	    ;	08900	C   JUMP IF NOT FOR 'PROXIMITY' MODE
18700		SUBI =15	    ;	09000	      NSWCH=K-15
18800	      	MOVEM 	K,NSWCH#
18900	      	JRST  	S2799 	    ;	09100	      GO TO 2799
19000	;           TO SWITCH ALWAYS USE OCT.#  /PBF4/  /OE5/  P=PROXIMITY, O=ORDINARY
19100	S4:	CAIE =20	   ;	09500	4     IF(K.NE.20)GO TO 21
19200	      	JRST  	S21   	   ;	09600	C   TRY AGAIN IF NOT A 'T'
19300	      	MOVE  	3,INP   -1(ML)	;09700	      IF(INP(ML).GT.0)GO TO 2799
19400	      	JUMPG 3,S2799;T12,8/ ETC. MAKES A METR, OR TIM SIG. POS NUMS AREN'T LETRS!
19500	      	MOVSI 02,214567  	; ***** CLEFS = 3000 *****  CODE 3.
19600		CAMN 3,LE
19700		FADR 2,[3.0]		; TENOR CLEF =3003, TREBLE=3000
19800	      	JRST  	SCLEF 	    ;	10100	      GO TO SCLEF
19900	S21:  	CAIE =19	   ; -- S -- 10200	21    IF(K.NE.19)GO TO 899
20000	      	JRST  	S2799	;NOT AN 'S'(STEM), UNKNOWN ITEM, SKIP IT.
20100		MOVE 2,INP-1(ML)	;10600	      IF(INP(ML).EQ.LDN)VX(1)=5020.
20200	      	MOVE  	03,[5000.0]	; SU  UP=5010
20300		CAMN 2,LU
20400		FADR 3,[10.0]
20500		CAMN 2,LD
20600		FADR 3,[20.0]   		;  DOWN = 5020
20700		CAMN 2,LPL	;IF(  .EQ.'+')   S+=5002
20800		FADR 3,[2.0]
20900		CAMN 2,LMI	;IF(  .EQ.'-')   S-=5001
21000		FADR 3,[1.0]	; IF(  .EQ.'0')  S0=5000
21100			;THESE ARE FOR S+, S-, S0; PUT NOTE ON OTHER STF.
21200	      	MOVEM 	03,VX
21300	      	JRST  	S512  	   ;	10700	      GO TO 512
21400	S15:	MOVE  	N,INP   -1(ML)	    ;	11100	      N=INP(ML)
21500		CAIN K,2	;IF(1ST LETR.NE.'B')GO TO S5
21600	      	CAME N,LA	    	;	11200	      IF(N.NE.'A')GO TO 5
21700	      	JRST  	S5    	     ;	11300	C   JUMP IF NOT BASS CLEF
21800	      	MOVE  	02,[3001.0]		;BASS CLEF=3001
21900	SCLEF:	MOVEM 	02,VX    
22000		SKIPGE XMINUS	    ;	11500	51    IF(XMINUS)VX(1)=-VX(1)
22100		MOVNS VX       ;11600	 TYPE '-BA' FOR INVISIBLE BASS CLEF, ETC.
22200	      	JRST  	S512  
22300	S5:   	CAME N,LL	   ;	11800	5     IF(N.NE.'L')GO TO 6
22400	      	JRST  	S6    	   ;	11900	   JUMP IF NOT ALTO CLEF
22500	      	MOVE  	02,[3002.0]
22600	      	JRST  	SCLEF 
22700	S6:	SUBI 2		; -2 BECAUSE MUSICAL ALPHABET STARTS WITH C
22800		SKIPG
22900		ADDI 7
23000		MOVE NNUM,K	; K IS AC0
23100		MOVEI QQ,=1000
23200	   	MOVEI 	K,1	;6	K=1
23300		CAILE NNUM,3	   ;	12300	      IF(NNUM.GT.3)K=2
23400		AOJ K,			;12500	C   FOUND A NOTE
23500		CAMN N,IXX	    ;	12700	      IF(N.EQ.IXX)GO TO 5410
23600	      	JRST  	S5410 	     ;	12800	C FOR GX3/ ETC.
23700	
23800		CAME N,INP-2(ML)		;IF(N.NE.INP(ML))GO TO SS6
23900		JRST SS6		; NO DOUBLE-LETTER ACCID. (FLAT)
24000		CAME N,INP(ML)		;IF(N.NE.INP(ML+1))GO TO S8-2
24100		JRST S8-2		;NO TRIPLE-LETTER ACCID. (SHARP)
24200		AOS ML			;ML=ML+1
24300		CAME N,INP(ML)		;IF(N.NE.INP(ML+1))GO TO S8 
24400		JRST S8			;NO TRIPLE-LETTER ACCID. (NATURAL)
24500		AOS ML			;ML=ML+1
24600		MOVEI QQ,=1300		;TYPE AA FOR AF, AAA = AS, AAAA = AN
24700		JRST S610
24800	
24900	SS6:  	JSA   	16,NALF       ;	12900	      K=NALF(N)
25000		JUMP N
25100	      	JUMPG 	N,S7     	;13000	      IF(N.GT.0)GO TO 7
25200				;13100	C   JUMP IF NOT A LETTER
25300		MOVEI QQ,=1300    ;  ***** NOTES  ***** =1000  2ND DIG=ACCI.
25400		CAIN =14	    ; --N-- 13300	IF(K.EQ.14)GO TO 610
25500	      	JRST  	S610  	      ;	13500	C   JUMP IF NATURAL
25600		CAIN =19	      ; -- S --	13400	 IF(K.EQ.19)GO TO 8
25700	      	JRST  	S8    
25800	      	MOVEI  QQ,=1100   	; IT'S A FLAT  
25900	      	JRST  	S610  
26000	S8:	MOVEI QQ,=1200   	; SHARP =1200
26100	S610: 	AOS   	ML    	     ;	14100	610   ML=ML+1
26200	      	JSA   	16,NALF  	;14200	      K=NALF(INP(ML))
26300		JUMP INP-1(ML)
26400		SKIPL INP-1(ML)		;IF CHAR. ISN'T A LETTER, GO TO S7
26500		JRST S7			; (LETTERS ARE NEG., NUMBS ARE POS.)
26600		CAIE =19		;IF(K.EQ.19) THEN IT'S SS
26700		JRST .+3		;FOR DBL FLAT, DBL SHARP
26800		MOVEI QQ,=1500  	;DBL FLAT
26900		JRST S610
27000		CAIE 6			;IS IT 'FF'?
27100		JRST S7
27200		MOVEI QQ,=1400   	;FF=1400, SS=1500
27300		JRST S610		; GO BACK FOR ANOTHER CHAR.
27400	S7:	CAIN =11	      ;-- K -- ??? 14300 7    IF(K.EQ.11)GO TO 5410
27500	      	JRST  	S5410 
27600		JUMPL K,S5410	    ;	14350	      IF(K.LT.0)GO TO 5410
27700				;14400	C   JUMP IF SEMICOLON OR BLANK
27800		CAIN =24	   ;-- X --14500    IF(K.NE.24)GO TO 24
27900	      	JRST  	S5410 		    ;	14800	24    JSCA=K-1
28000	S24:	MOVEM K,JSCA#		; SAVE OCT. NUM
28100	      	AOS   	ML    	   ;	14900	      ML=ML+1
28200	      	JRST  	S2410 
28300	S5410:	SKIPN NSWCH 	;15300	5410  IF(NSWCH.EQ.0)GO TO 2410
28400	      	JRST S2410
28500		MOVN  	JJ,NNUM  	;	15910	7410  JJ=NOLD-NNUM
28600	      	ADD   	JJ,NOLD  
28700		CAIL JJ,4	   ;	15920	      IF(JJ.LT.4)GO TO 377
28800	      	AOS JSCA
28900	 	CAMG JJ,[-4]	   ;	16010	377   IF(JJ.GT.-4)GO TO 2410
29000	      	SOS   	JSCA  
29100			;WILL JUMP TO NEAREST NOTE  (DIATONIC-'75)
29200	S2410:	MOVEI 	JJ,1	;	16200	2410  JJ=1
29300	      	SETZM 	VX+1  	;	16300	      VX2=0
29400		MOVE 2,JSCA	;VX1=(1000+ACCI*100+OCT*7+NNUM)*DBST
29500		IMULI 2,7
29600		ADD 2,NNUM
29700		ADD 2,QQ	; ADD 1000+OCT*7 (QQ)
29800		FLTR 2,2
29900		FMPR 2,DBST
30000		MOVEM 2,VX	  ;	16500	C  DOUBLE STOPS ARE NEG. NUMBERS
30100	      	MOVEM 	NNUM,NOLD#	;	16600	      NOLD=NNUM
30200	;;  ?S4410:	MOVNI 	NNUM,2	       ;16700	4410  NNUM=-2
30300	S4410:     	MOVE  	02,ISEMI 	;16800	      IF(INP(ML).EQ.ISEMI)RETURN
30400	      	CAMN  	02,INP   -1(ML)
30500		JRST SEND
30600			;ABOVE FINDS SCALE NOTES; IF NSWCH=0 OCT. NUM WILL STICK UNTIL RESET
30700	      	JRST  	S310  
30800	S210: 	AOS   	JJ    	;	17100	210   JJ=JJ+1
30900		CAIN JJ,1	;	17200	      IF(JJ.EQ.1)GO TO 3310
31000	      	JRST  	S3310 
31100	      	MOVSI 	XMINUS,201400	;	17300	      XMINUS=1.
31200	      	SETZM 	VX    -1(JJ)	;	17400	      VX(JJ)=0
31300			;  'X N1,N2' MAY REPLACE 'REP N1,N2'.  N2=0 BECOMES N2=2
31400	      	JRST  	S310  	 ;	17800	C   JUMP IF A LETTER
31500	S1410:	MOVE MODE	;  17900	1410  IF(N.NE.'-')GO TO 14
31600		CAME N,LMI
31700	      	JRST  	S544  
31800		MOVN XMINUS,[1.0]    ;	18000	      XMINUS=-1.
31900		JUMPE JJ,S2799	; IF(JJ.EQ.0)GO TO 2799  -- FOR '-BA' ETC.
32000		CAIN 1
32100		JRST S644	; IF(MODE.EQ.1)GO TO 644  [FOR AUTO OCT. SYS.]
32200		JRST S2799	;	18100	      GO TO 2799
32300	S544:	CAIN 1  	; IF(N.NE.'+')GO TO 14
32400		CAME N,LPL
32500		JRST S14
32600	S644:	MOVSI 7,203700   ; [7.0]   DEFAULT IS OCTAVE. (+ OR - 7)
32700		JSA 16,NALF
32800		JUMP ALF-1(ML)	;THE NEXT CHARACTER.
32900		CAIG =9
33000		SKIPG
33100		JRST S744	;NEXT IS NOT A NUMB.
33200		FLTR 7,0		;MOVE 7,0
33300		AOJ ML,
33400	S744:	CAME N,LPL
33500		MOVNS 7
33600		MOVEM 7,VX4	; SEND IT TO SCMSS -- AT 71
33700		JRST S2799
33800	
33900				;	18102	144   TRIP=0
34000	S144: 	SETZM 	TRIP
34100				;	18105	444   IF(K.EQ.8)VX1=2
34200	S444: 	CAIE =8
34300		JRST .+3
34400		MOVSI 2,202400
34500		JRST SVX
34600		CAIE 4			;18107	      IF(K.EQ.4)VX1=.5
34700		JRST .+3
34800		MOVSI 2,200400
34900		JRST SVX
35000		CAIE 5	     ;	18110	      IF(K.EQ.5)VX1=8
35100		JRST .+3
35200	      	MOVSI 	02,204400
35300		JRST SVX
35400		CAIE 7	   ;	18115	      IF(K.EQ.7)VX1=88
35500		JRST .+3
35600	      	MOVSI 	02,207540
35700		JRST SVX
35800		CAIE =19	;	18120	      IF(K.EQ.19)VX1=16
35900		JRST .+3
36000	      	MOVSI 	02,205400
36100		JRST SVX
36200		CAIE =20	;	18125	      IF(K.NE.20)GO TO 244
36300	      	JRST  	S244  
36400	      	MOVSI 	02,204600	    ;	18126	      VX1=12
36500	      	MOVE  	N,INP   -1(ML)	    ;	18127	      N=INP(ML)
36600		CAME N,LBL	;	18129	      IF(N.EQ.LBL)GO TO 344
36700		CAMN N,ISEMI
36800	;;    	JRST  	S344  	      ;	18131	      IF(N.EQ.ISEMI)GO TO 344
36900		JRST SVX
37000		CAMN N,IXX		; IF(N.EQ.IXX)GO TO SVX
37100		JRST SVX
37200	      	MOVSI 	TRIP,576400	;	18133	      TRIP=-1
37300	      	AOS   	ML    	      ;	18150	      ML=ML+1
37400	      	JSA   	16,NALF  	   ;	18155	      K=NALF(N)
37500		JUMP N
37600		MOVE N,INP-1(ML)	; N=INP(ML)  *******
37700	      	JRST  	S444  	     ;	18160	      GO TO 444
37800	S244: 	CAIE =23	;	18220	244   IF(K.EQ.23)VX1=1
37900		JRST .+3
38000	      	MOVSI 	02,201400
38100		JRST .+4
38200		CAIE =17	;	18222	      IF(K.EQ.17)VX1=4
38300		JRST .+3
38400	      	MOVSI 	02,203400
38500	SVX:     MOVEM 	02,VX	;	18223	C TS=24TH, TQ=6, TH=3.
38600		    ; FOR S,E,Q,H,W,D,T RHYTH.  'T'(K=20) =TRIPLET  D=DBL WHL NOTE
38700	      	JUMPGE	TRIP,S344  	;18225	      IF(TRIP)VX1=VX1*1.5
38800		MOVSI 2,201600
38900	      	FMPRM 	02,VX
39000	S344: 	AOS   	JJ    	;	18226	344   JJ=JJ+1
39100	      	JRST  	S1310 
39200		
39300	S14:  	SETOM 	ISKP  	;	18230	14    ISKP=-1
39400		CAME N,DOT	;	18300	      IF(N.NE.'.')GO TO 79
39500	      	JRST  	S79   
39600		MOVE DECI,M	;	18400	      DECI=M
39700	      	JRST  	S75   
39800	S79:  	AOS   	M     	;	18600	79    M=M+1
39900	      	JSA   	16,NALF  	;18700	      IQ(M)=NALF(N)
40000		JUMP N
40100	      	MOVEM 	00,IQ    -1(M)
40200	
40300	S75:    CAMN N,ISEMI     	;18900	75    IF(N.EQ.ISEMI)GO TO 751
40400	      	JRST  	S751  
40500	      	MOVEI 	02,1	;	18950	      IF(INP(ML).NE.1)GO TO 2799
40600	      	CAME  	02,INP   -1(ML)
40700	      	JRST  	S2799 
40800	S751: 	JUMPE ISKP,SEND	    ;	19000	751   IF(ISKP.EQ.0)RETURN
40900	S202: 	CAME DECI,[-1]	   ;	19100	202   IF(DECI.NE.-1)GO TO 302
41000	      	JRST  	S302  
41100	
41200	      	SETZM 	DECI  	;	19200	      DECI=0
41300	
41400	      	JRST  	S402  
41500	
41600	S302: 	SUB DECI,M	;	19400	302   DECI=M-DECI
41700		MOVNS DECI	;	19500	402   RRN=0
41800	S402: 	SETZM 	RRN#	;	19600	      REXP=M-1
41900	      	MOVNI 	02,1
42000	      	ADD   	02,M     
42100		FLTR 2,2		;TLC 2,232000
42200	;;	FADR 2,2
42300		MOVEM 2,REXP	;	19700	      IF(M.LT.1)M=1
42400		CAIGE M,1
42500		MOVEI M,1	;	19800	      DO 171 K=1,M
42600	      	MOVEI 	QQ,1		;USE QQ FOR INDEX
42700	;	19900	      IF(REXP.GT.1)GO TO 1
42800	S171: 	MOVSI 	02,201400
42900	      	CAMGE 	02,REXP  
43000	      	JRST  	S1    	;	20000	      RRV=10
43100	      	MOVSI 	02,204500	; RRV IS IN 2
43200	;	20100	      IF(REXP.EQ.0)RRV=1
43300	      	SKIPN REXP   
43400	      	MOVSI 	02,201400
43500	      	JRST  	S11   	;	20300	1     RRV=10.**REXP
43600	S1:   	MOVSI 	02,204500
43700	      	MOVE  	03,REXP  
43800	      	PUSHJ 	17,EXP3.2	;20400	11    RRN=RRN+IQ(K)*RRV
43900	S11:  	FLTR 3,IQ-1(QQ)		;MOVE  	3,IQ-1(QQ)
44000	      	FMPR  	2,3   
44100	      	FADRM 	2,RRN   	;	20500	171     REXP=REXP-1
44200	  	MOVSI 	02,576400
44300	      	FADRM 	02,REXP  
44400	      	CAMGE 	QQ,M     
44500	      	AOJA  	QQ,S171  
44600		JUMPE DECI,.+6
44700		FLTR DECI,DECI		;TLC DECI,232000
44800	;	20600	      A=10.**DECI
44900	      	MOVSI 	02,204500
45000	      	MOVE  	03,DECI  
45100	      	PUSHJ 	17,EXP3.2	; A WILL BE IN AC2
45200	;	20700	      IF(DECI.EQ.0)A=1.
45300		SKIPA
45400	      	MOVSI 	02,201400	;	20800	      JJ=JJ+1
45500	      	AOS   	JJ    	;	20900	      VX(JJ)=RRN/A*XMINUS
45600	      	MOVE  	1,RRN   
45700	      	FDVR  	1,2     
45800	      	FMPR  	1,XMINUS
45900	      	MOVEM 	1,VX    -1(JJ)	;	21000	      JN=-JN
46000	      	MOVNS 	00,JN    ;21100	C   SETS IT TO -1 FOR L,R,U,D EDIT ROUTINE
46100	      	MOVEI 	02,2	;	21200	      IF(MODE.NE.2)XMINUS=1.
46200	      	CAME  	02,MODE  
46300		MOVMS XMINUS	;	21300	C************: MODE #?
46400	;	21400	C  ONLY ONE - NEEDED FOR RHY.COMPOSITE
46500	;	21500	1310  IF(INP(ML).NE.1)GO TO 310
46600	S1310:	MOVEI 	3,1
46700	      	CAME  	3,INP -1(ML)
46800	      	JRST  	S310  ;21600  VX(JJ+1)=VX(JJ)*2.  ; FOR DOTTED RHYTHMS
46900	      	MOVE  	02,VX -1(JJ)
47000	      	FSC   	02,1
47100	      	MOVEM 	02,VX (JJ)	;	21700	      JJ=JJ+1
47200	      	AOS   	JJ    	;	21800	      ML=ML+1
47300	      	AOS   	ML    
47400	      	JRST  	S1310 +1	;	22000	206   ML=ML+2
47500	S206: 	ADDI ML,2	;	22100	3310  VX(1)=-99.
47600	S3310:	MOVN  	02,[99.0]
47700	      	MOVEM 	02,VX    	;	22200	310      ISKP=0
47800	S310: 	SETZM 	ISKP  	;	22300	        IF(N.NE.ISEMI)GO TO 999
47900	      	CAME  	N,ISEMI 
48000	      	JRST  	S999  	;	22500	      RETURN
48100	SEND:	MOVEM ML,ALF+=72
48200		MOVEM JJ,SC+=9
48300		JRA 16,(16)	;	22600	73    JJ=JJ+1
48400	S73:  	AOS   	JJ    	;	22650	      K=INP(ML)
48500	      	MOVE  	K,INP   -1(ML) ;22700	       IF(K.EQ.'E')GO TO 206
48600		CAMN K,LE
48700	      	JRST  	S206  ;	  NEXT IS FOR A REST/R/ OR /RI/ FOR INVIS. REST
48800	;	22810	      IF(K.EQ.'D')GO TO 1073
48900		CAMN K,LD
49000	      	JRST  	S1073 
49100			; /RD/ OR /RU/ = REST 6 DOWN OR 6 UP.
49200	;	22830	      IF(K.EQ.'U')GO TO 1173
49300		CAMN K,LU
49400	      	JRST  	S1173 	;	22900	      IF(K.EQ.'I')GO TO 573
49500		CAMN K,LI
49600	      	JRST  	S573  	;	22910	      IF(K.EQ.'W')GO TO 273
49700		CAMN K,LW
49800	      	JRST  	S273  
49900			;  /RW/ MAKES WHOLE REST REGARDLESS OF TIME VALUE GIVEN.
50000		CAMN K,LR	;IF(K.EQ.'R')GO TO 1273
50100		JRST S1273	; /RR/ MAKES REPEAT BAR SIGN (REST=-4)
50200	
50300			; *** ADD NUMBERS LATER *****;	22932	      K=NALF(K)
50400	      	JSA   	16,NALF  
50500		JUMP K	;	22934	      IF(K)GO TO 673
50600	      	JUMPL 	K,S673  ;	22936	      IF(K.GE.10)GO TO 673
50700	      	CAIL =10
50800	      	JRST  	S673  	;	22940	973   KV=NALF(INP(ML+1))
50900	S973:	MOVE 15,K
51000	 	JSA 16,NALF
51100		JUMP INP(ML)
51200			;  FOR 3-DIG. NUMBS.   CAN TAKE NUM UP TO 999 FOR RESTS.
51300	;	22942	      IF(KV)GO TO 873
51400		JUMPL S873	;22944	      IF(KV.GE.10)GO TO 873
51500		CAIL =10
51600	      	JRST  	S873  	;	22945	      ML=ML+1
51700	      	AOS   	ML    	;	22946	      K=K*10+KV
51800		IMULI 15,=10
51900	      	IMUL  	02,K     
52000		ADD 15,K		; 15 IS K FOR NOW AND K IS IV
52100	      	JRST  	S973+1
52200	
52300	S873: 	ADDI 15,=2000		; QQ IS AC15 NOW.  RW =2002
52400		MOVNS 15
52500		FLTR 15,15		;TLC 15,232000
52600	      	JRST  	S473  
52700	S673: 	MOVSI	15,213764  	;QQ=2000
52800	      	JRST  	S373  		;ORDINARY REST
52900	S573: 	MOVE 	15,[2001.0]	;INVISIBLE REST
53000	      	JRST  	S473  
53100	S273: 	MOVE 	15,[2002.0]	;WHOLE REST (NO MATTER WHAT RHYTH.]
53200	S473: 	AOS   	ML    	    ;	22990	473   ML=ML+1
53300	S373: 	MOVEM 15,VX-1(JJ)	;	23000	373   VX(JJ)=QQ
53400	      	JRST  	S4410 
53500	S1073:	MOVSI 	15,213765  	;RD = REST DONW  2004
53600	      	JRST  	S473  
53700	S1173:	MOVE  	15,[2005.0]	;RU = REST UP  2005
53800	      	JRST  	S473  
53900	S1273:	MOVE 15,[2003.0]	;RR = BAR REPEAT SIGN 
54000		JRST S473		; FOR /RR/
54100		   	      ;23400	      END
54200	LNEND:	0	;SEE FORTR. TEXT IN WORDS.F4
54300		MOVE 0,SCX+=11		; *
54400		MOVE 1,SCX+=13		; ;
54500		MOVE 2,SCN+4  		; /
54600		MOVEI 3,=71
54700	L2901:	CAME 2,ALF(3)
54800		JRST L2903
54900		MOVEM 1,ALF(3)
55000		JRA 16,(16)
55100	L2903:	CAME 1,ALF(3)
55200		JRST L2902
55300		MOVEM 0,ALF(3)
55400		JRA 16,(16)
55500	L2902:	SKIPLE 3
55600		SOJA 3,L2901
55700		JRA 16,(16)
55800		   
55900	STFNUM:	0	;FUNCTION STFNUM(STAFF)
56000		SETOM SCANR		;SCANR=-1   FLAG
56100		SETZ 6,
56200	STFN1:	MOVE 2,INP(6)
56300		MOVE 4,INP+1(6)
56400		CAME 2,LS		;IS INP1='S'?
56500		JRST NONUM
56600		CAME 4,[ASCIZ/T    /]	;  IF(INP(2).EQ.'T')STAFF=NEXT NUM
56700		CAMN 4,[ASCIZ/P    /]	; IS IT A P?
56800		SKIPA
56900		JRST NONUM		;NO
57000		MOVE 3,[ASCIZ/Z    /]	;PUT Z'S INTO FIRST LOCS.
57100		MOVE ML,6		;ML=3+PTR
57200		ADDI ML,3
57300		MOVSI XMINUS,201400
57400		MOVE 2,INP+2(6)		;LOOK AT 3RD CHAR.
57500		CAME 2,LMI		;IS IT MINUS?
57600		JRST .+3
57700		MOVNS XMINUS
57800		AOJ ML,			;ML=ML+1
57900		JSA 16,NALF		;GET THE STAFF NUM.
58000		JUMP INP-1(ML)
58100		FLTR
58200		FMPR XMINUS
58300		CAME 4,[ASCIZ/P    /]	;IF NOT 'P' GO TO STFN2
58400		JRST STFN2
58500		SETOM SCX+=34		;RB=-1
58600		MOVEM RMOD+1		;SET4 IS NOW FILLED
58700		JRST STFN3-1
58800	STFN2:	SETZM SCX+=34		;RB=0
58900		MOVEM @(16)	;TYPE STn/ TO SET STAFF NUM FOR ENTIRE LINE.
59000		MOVE ML,6  
59100	STFN3:	MOVE 2,INP(ML)		;LOOK FOR THE SLASH AND THROW ALL AWAY
59200		MOVEM 3,INP(ML)		;SKIP UNTIL SEMI (CHANGED FROM SLASH AT S899)
59300		AOJ ML,
59400		CAME 2,LSL  
59500		JRST STFN3
59600	   	SETZM SCANR		;RETURN A ZERO
59700		MOVE 6,ML
59800		JRST STFN1		;GO BACK AND LOOK FOR MORE.
59900	NONUM:	MOVE SCANR		;NO STAFF NUM, RETURN A -1
60000		JRA 16,1(16)
60100	
60200	RLOOP:	0		;CALL RLOOP(A,B,K)
60300		HRLI 1,@1(16)	;DIMENSION A(1),B(1)  --  SOURCE
60400		HRRI 1,@(16)	;DO 1 J=1,K     -- DESTINATION
60500		MOVE 2,(16)    ;1	A(J)=B(J)  -- WORD COUNT
60600		ADD  2,@2(16)  ;LOC OF ARRAY A + WDCNT.
60700		BLT  1,-1(2)
60800		JRA 16,3(16)
60900		END